/*
 * APICloud JavaScript Library
 * Copyright (c) 2014 apicloud.com
 */
(function(window) {
    var u = {};
    var isAndroid = (/android/gi).test(navigator.appVersion);
    var uzStorage = function() {
        var ls = window.localStorage;
        if (isAndroid) {
            ls = os.localStorage();
        }
        return ls;
    };

    function parseArguments(url, data, fnSuc, dataType) {
        if (typeof(data) == 'function') {
            dataType = fnSuc;
            fnSuc = data;
            data = undefined;
        }
        if (typeof(fnSuc) != 'function') {
            dataType = fnSuc;
            fnSuc = undefined;
        }
        return {
            url: url,
            data: data,
            fnSuc: fnSuc,
            dataType: dataType
        };
    }
    u.trim = function(str) {
        if (String.prototype.trim) {
            return str == null ? "" : String.prototype.trim.call(str);
        } else {
            return str.replace(/(^\s*)|(\s*$)/g, "");
        }
    };
    u.trimAll = function(str) {
        return str.replace(/\s*/g, '');
    };
    u.isElement = function(obj) {
        return !!(obj && obj.nodeType == 1);
    };
    u.isArray = function(obj) {
        if (Array.isArray) {
            return Array.isArray(obj);
        } else {
            return obj instanceof Array;
        }
    };
    u.isEmptyObject = function(obj) {
        if (JSON.stringify(obj) === '{}') {
            return true;
        }
        return false;
    };
    u.addEvt = function(el, name, fn, useCapture) {
        if (!u.isElement(el)) {
            console.warn('$api.addEvt Function need el param, el param must be DOM Element');
            return;
        }
        useCapture = useCapture || false;
        if (el.addEventListener) {
            el.addEventListener(name, fn, useCapture);
        }
    };
    u.rmEvt = function(el, name, fn, useCapture) {
        if (!u.isElement(el)) {
            console.warn('$api.rmEvt Function need el param, el param must be DOM Element');
            return;
        }
        useCapture = useCapture || false;
        if (el.removeEventListener) {
            el.removeEventListener(name, fn, useCapture);
        }
    };
    u.one = function(el, name, fn, useCapture) {
        if (!u.isElement(el)) {
            console.warn('$api.one Function need el param, el param must be DOM Element');
            return;
        }
        useCapture = useCapture || false;
        var that = this;
        var cb = function() {
            fn && fn();
            that.rmEvt(el, name, cb, useCapture);
        };
        that.addEvt(el, name, cb, useCapture);
    };
    u.dom = function(el, selector) {
        if (arguments.length === 1 && typeof arguments[0] == 'string') {
            if (document.querySelector) {
                return document.querySelector(arguments[0]);
            }
        } else if (arguments.length === 2) {
            if (el.querySelector) {
                return el.querySelector(selector);
            }
        }
    };
    u.domAll = function(el, selector) {
        if (arguments.length === 1 && typeof arguments[0] == 'string') {
            if (document.querySelectorAll) {
                return document.querySelectorAll(arguments[0]);
            }
        } else if (arguments.length === 2) {
            if (el.querySelectorAll) {
                return el.querySelectorAll(selector);
            }
        }
    };
    u.byId = function(id) {
        return document.getElementById(id);
    };
    u.first = function(el, selector) {
        if (arguments.length === 1) {
            if (!u.isElement(el)) {
                console.warn('$api.first Function need el param, el param must be DOM Element');
                return;
            }
            return el.children[0];
        }
        if (arguments.length === 2) {
            return this.dom(el, selector + ':first-child');
        }
    };
    u.last = function(el, selector) {
        if (arguments.length === 1) {
            if (!u.isElement(el)) {
                console.warn('$api.last Function need el param, el param must be DOM Element');
                return;
            }
            var children = el.children;
            return children[children.length - 1];
        }
        if (arguments.length === 2) {
            return this.dom(el, selector + ':last-child');
        }
    };
    u.eq = function(el, index) {
        return this.dom(el, ':nth-child(' + index + ')');
    };
    u.not = function(el, selector) {
        return this.domAll(el, ':not(' + selector + ')');
    };
    u.prev = function(el) {
        if (!u.isElement(el)) {
            console.warn('$api.prev Function need el param, el param must be DOM Element');
            return;
        }
        var node = el.previousSibling;
        if (node.nodeType && node.nodeType === 3) {
            node = node.previousSibling;
            return node;
        }
    };
    u.next = function(el) {
        if (!u.isElement(el)) {
            console.warn('$api.next Function need el param, el param must be DOM Element');
            return;
        }
        var node = el.nextSibling;
        if (node.nodeType && node.nodeType === 3) {
            node = node.nextSibling;
            return node;
        }
    };
    u.closest = function(el, selector) {
        if (!u.isElement(el)) {
            console.warn('$api.closest Function need el param, el param must be DOM Element');
            return;
        }
        var doms, targetDom;
        var isSame = function(doms, el) {
            var i = 0,
                len = doms.length;
            for (i; i < len; i++) {
                if (doms[i].isEqualNode(el)) {
                    return doms[i];
                }
            }
            return false;
        };
        var traversal = function(el, selector) {
            doms = u.domAll(el.parentNode, selector);
            targetDom = isSame(doms, el);
            while (!targetDom) {
                el = el.parentNode;
                if (el != null && el.nodeType == el.DOCUMENT_NODE) {
                    return false;
                }
                traversal(el, selector);
            }

            return targetDom;
        };

        return traversal(el, selector);
    };
    u.contains = function(parent, el) {
        var mark = false;
        if (el === parent) {
            mark = true;
            return mark;
        } else {
            do {
                el = el.parentNode;
                if (el === parent) {
                    mark = true;
                    return mark;
                }
            } while (el === document.body || el === document.documentElement);

            return mark;
        }

    };
    u.remove = function(el) {
        if (el && el.parentNode) {
            el.parentNode.removeChild(el);
        }
    };
    u.attr = function(el, name, value) {
        if (!u.isElement(el)) {
            console.warn('$api.attr Function need el param, el param must be DOM Element');
            return;
        }
        if (arguments.length == 2) {
            return el.getAttribute(name);
        } else if (arguments.length == 3) {
            el.setAttribute(name, value);
            return el;
        }
    };
    u.removeAttr = function(el, name) {
        if (!u.isElement(el)) {
            console.warn('$api.removeAttr Function need el param, el param must be DOM Element');
            return;
        }
        if (arguments.length === 2) {
            el.removeAttribute(name);
        }
    };
    u.hasCls = function(el, cls) {
        if (!u.isElement(el)) {
            console.warn('$api.hasCls Function need el param, el param must be DOM Element');
            return;
        }
        if (el.className.indexOf(cls) > -1) {
            return true;
        } else {
            return false;
        }
    };
    u.addCls = function(el, cls) {
        if (!u.isElement(el)) {
            console.warn('$api.addCls Function need el param, el param must be DOM Element');
            return;
        }
        if ('classList' in el) {
            el.classList.add(cls);
        } else {
            var preCls = el.className;
            var newCls = preCls + ' ' + cls;
            el.className = newCls;
        }
        return el;
    };
    u.removeCls = function(el, cls) {
        if (!u.isElement(el)) {
            console.warn('$api.removeCls Function need el param, el param must be DOM Element');
            return;
        }
        if ('classList' in el) {
            el.classList.remove(cls);
        } else {
            var preCls = el.className;
            var newCls = preCls.replace(cls, '');
            el.className = newCls;
        }
        return el;
    };
    u.toggleCls = function(el, cls) {
        if (!u.isElement(el)) {
            console.warn('$api.toggleCls Function need el param, el param must be DOM Element');
            return;
        }
        if ('classList' in el) {
            el.classList.toggle(cls);
        } else {
            if (u.hasCls(el, cls)) {
                u.removeCls(el, cls);
            } else {
                u.addCls(el, cls);
            }
        }
        return el;
    };
    u.val = function(el, val) {
        if (!u.isElement(el)) {
            console.warn('$api.val Function need el param, el param must be DOM Element');
            return;
        }
        if (arguments.length === 1) {
            switch (el.tagName) {
                case 'SELECT':
                    var value = el.options[el.selectedIndex].value;
                    return value;
                    break;
                case 'INPUT':
                    return el.value;
                    break;
                case 'TEXTAREA':
                    return el.value;
                    break;
            }
        }
        if (arguments.length === 2) {
            switch (el.tagName) {
                case 'SELECT':
                    el.options[el.selectedIndex].value = val;
                    return el;
                    break;
                case 'INPUT':
                    el.value = val;
                    return el;
                    break;
                case 'TEXTAREA':
                    el.value = val;
                    return el;
                    break;
            }
        }

    };
    u.prepend = function(el, html) {
        if (!u.isElement(el)) {
            console.warn('$api.prepend Function need el param, el param must be DOM Element');
            return;
        }
        el.insertAdjacentHTML('afterbegin', html);
        return el;
    };
    u.append = function(el, html) {
        if (!u.isElement(el)) {
            console.warn('$api.append Function need el param, el param must be DOM Element');
            return;
        }
        el.insertAdjacentHTML('beforeend', html);
        return el;
    };
    u.before = function(el, html) {
        if (!u.isElement(el)) {
            console.warn('$api.before Function need el param, el param must be DOM Element');
            return;
        }
        el.insertAdjacentHTML('beforebegin', html);
        return el;
    };
    u.after = function(el, html) {
        if (!u.isElement(el)) {
            console.warn('$api.after Function need el param, el param must be DOM Element');
            return;
        }
        el.insertAdjacentHTML('afterend', html);
        return el;
    };
    u.html = function(el, html) {
        if (!u.isElement(el)) {
            console.warn('$api.html Function need el param, el param must be DOM Element');
            return;
        }
        if (arguments.length === 1) {
            return el.innerHTML;
        } else if (arguments.length === 2) {
            el.innerHTML = html;
            return el;
        }
    };
    u.text = function(el, txt) {
        if (!u.isElement(el)) {
            console.warn('$api.text Function need el param, el param must be DOM Element');
            return;
        }
        if (arguments.length === 1) {
            return el.textContent;
        } else if (arguments.length === 2) {
            el.textContent = txt;
            return el;
        }
    };
    u.offset = function(el) {
        if (!u.isElement(el)) {
            console.warn('$api.offset Function need el param, el param must be DOM Element');
            return;
        }
        var sl = Math.max(document.documentElement.scrollLeft, document.body.scrollLeft);
        var st = Math.max(document.documentElement.scrollTop, document.body.scrollTop);

        var rect = el.getBoundingClientRect();
        return {
            l: rect.left + sl,
            t: rect.top + st,
            w: el.offsetWidth,
            h: el.offsetHeight
        };
    };
    u.css = function(el, css) {
        if (!u.isElement(el)) {
            console.warn('$api.css Function need el param, el param must be DOM Element');
            return;
        }
        if (typeof css == 'string' && css.indexOf(':') > 0) {
            el.style && (el.style.cssText += ';' + css);
        }
    };
    u.cssVal = function(el, prop) {
        if (!u.isElement(el)) {
            console.warn('$api.cssVal Function need el param, el param must be DOM Element');
            return;
        }
        if (arguments.length === 2) {
            var computedStyle = window.getComputedStyle(el, null);
            return computedStyle.getPropertyValue(prop);
        }
    };
    u.jsonToStr = function(json) {
        if (typeof json === 'object') {
            return JSON && JSON.stringify(json);
        }
    };
    u.strToJson = function(str) {
        if (typeof str === 'string') {
            return JSON && JSON.parse(str);
        }
    };
    u.setStorage = function(key, value) {
        if (arguments.length === 2) {
            var v = value;
            if (typeof v == 'object') {
                v = JSON.stringify(v);
                v = 'obj-' + v;
            } else {
                v = 'str-' + v;
            }
            var ls = uzStorage();
            if (ls) {
                ls.setItem(key, v);
            }
        }
    };
    u.getStorage = function(key) {
        var ls = uzStorage();
        if (ls) {
            var v = ls.getItem(key);
            if (!v) {
                return;
            }
            if (v.indexOf('obj-') === 0) {
                v = v.slice(4);
                return JSON.parse(v);
            } else if (v.indexOf('str-') === 0) {
                return v.slice(4);
            }
        }
    };
    u.rmStorage = function(key) {
        var ls = uzStorage();
        if (ls && key) {
            ls.removeItem(key);
        }
    };
    u.clearStorage = function() {
        var ls = uzStorage();
        if (ls) {
            ls.clear();
        }
    };


    /*by king*/
    u.fixIos7Bar = function(el) {
        if (!u.isElement(el)) {
            console.warn('$api.fixIos7Bar Function need el param, el param must be DOM Element');
            return;
        }
        var strDM = api.systemType;
        if (strDM == 'ios') {
            var strSV = api.systemVersion;
            var numSV = parseInt(strSV, 10);
            var fullScreen = api.fullScreen;
            var iOS7StatusBarAppearance = api.iOS7StatusBarAppearance;
            if (numSV >= 7 && !fullScreen && iOS7StatusBarAppearance) {
                el.style.paddingTop = '20px';
            }
        }
    };
    u.fixStatusBar = function(el) {
        if (!u.isElement(el)) {
            console.warn('$api.fixStatusBar Function need el param, el param must be DOM Element');
            return;
        }
        var sysType = api.systemType;
        if (sysType == 'ios') {
            u.fixIos7Bar(el);
        } else if (sysType == 'android') {
            var ver = api.systemVersion;
            ver = parseFloat(ver);
            if (ver >= 4.4) {
                el.style.paddingTop = '25px';
            }
        }
    };
    u.toast = function(title, text, time) {
        var opts = {};
        var show = function(opts, time) {
            api.showProgress(opts);
            setTimeout(function() {
                api.hideProgress();
            }, time);
        };
        if (arguments.length === 1) {
            var time = time || 500;
            if (typeof title === 'number') {
                time = title;
            } else {
                opts.title = title + '';
            }
            show(opts, time);
        } else if (arguments.length === 2) {
            var time = time || 500;
            var text = text;
            if (typeof text === "number") {
                var tmp = text;
                time = tmp;
                text = null;
            }
            if (title) {
                opts.title = title;
            }
            if (text) {
                opts.text = text;
            }
            show(opts, time);
        }
        if (title) {
            opts.title = title;
        }
        if (text) {
            opts.text = text;
        }
        time = time || 500;
        show(opts, time);
    };
    u.post = function( /*url,data,fnSuc,dataType*/ ) {
        var argsToJson = parseArguments.apply(null, arguments);
        var json = {};
        var fnSuc = argsToJson.fnSuc;
        argsToJson.url && (json.url = argsToJson.url);
        argsToJson.data && (json.data = argsToJson.data);
        if (argsToJson.dataType) {
            var type = argsToJson.dataType.toLowerCase();
            if (type == 'text' || type == 'json') {
                json.dataType = type;
            }
        } else {
            json.dataType = 'json';
        }
        json.method = 'post';
        api.ajax(json,
            function(ret, err) {
                if (ret) {
                    fnSuc && fnSuc(ret);
                }
            }
        );
    };
    u.get = function( /*url,fnSuc,dataType*/ ) {
        var argsToJson = parseArguments.apply(null, arguments);
        var json = {};
        var fnSuc = argsToJson.fnSuc;
        argsToJson.url && (json.url = argsToJson.url);
        //argsToJson.data && (json.data = argsToJson.data);
        if (argsToJson.dataType) {
            var type = argsToJson.dataType.toLowerCase();
            if (type == 'text' || type == 'json') {
                json.dataType = type;
            }
        } else {
            json.dataType = 'text';
        }
        json.method = 'get';
        api.ajax(json,
            function(ret, err) {
                if (ret) {
                    fnSuc && fnSuc(ret);
                }
            }
        );
    };

    //===================================我自己写的方法=========================//



    u.do_post = function(url, param, cb) {
        //获取服务器地址
        u.getServerUrl(function(serverUrl) {
            api.ajax({
                url: serverUrl + url,
                method: 'post',
                timeout: 30,
                data: param,
                dataType: 'json',
                returnAll: false,
                headers: {
                    "Content-type": "application/json;charset=UTF-8"
                }
            }, function(reqRet, err) {
                api.hideProgress();
                if (reqRet) {
                    cb(reqRet);
                } else {
                    api.alert({
                        msg: ('错误码：' + err.code + '；错误信息：' + err.msg + '网络状态码：' + err.statusCode)
                    });
                }
            });
        });
    };
    u.do_get = function(url, cb) {
        //获取服务器地址
        u.getServerUrl(function(serviceUrl) {
            api.ajax({
                url: serviceUrl + url,
                method: 'get',
                timeout: 30,
                dataType: 'json',
                returnAll: false,
                headers: {
                    "Content-type": "application/json;charset=UTF-8"
                }
            }, function(reqRet, err) {
                if (reqRet) {
                    cb(reqRet);
                } else {
                    api.alert({
                        msg: ('错误码：' + err.code + '；错误信息：' + err.msg + '网络状态码：' + err.statusCode)
                    });
                }
            });
        });
    };

    //HTML数据替换
    u.replaceHtml = function(html, val) {
        var tempData = html.html();
        for (var pro in val) {
            var reVal = val[pro];
            var needVal = "{{" + pro + "}}";
            tempData = tempData.replace(new RegExp(needVal, 'g'), reVal);
        }

        //判断有哪些值是没有被替换的
        var reg = /{{\w*}}/g;
        var errVal = tempData.match(reg);
        if (errVal) {
            errVal.forEach(function(item) {
                //如果含有未被替换的值,则生成错误提示
                tempData = tempData.replace(item, '');
            });
        }
        html.html(tempData);
    };

    u.replaceFileHtml = function(file, val, cb) {
        api.readFile({
            path: "widget://html/fragment/" + file
        }, function(ret, err) {
            if (ret.status) {
                var tempData = ret.data;
                for (var pro in val) {
                    var reVal = val[pro];
                    var needVal = "{{" + pro + "}}";
                    tempData = tempData.replace(new RegExp(needVal, 'g'), reVal);
                }

                //判断有哪些值是没有被替换的
                var reg = /{{\w*}}/g;
                var errVal = tempData.match(reg);
                if (errVal) {
                    errVal.forEach(function(item) {
                        //如果含有未被替换的值,则生成错误提示
                        tempData = tempData.replace(item, '');
                    });
                }
                cb(tempData);
            }
        });
    };

    /**
     * 根据模板,数据,往容器插入html
     * @param fragmentName 模板路径
     * @param dataList 数据集合
     * @param contentId 容器id
     */
    u.crateDom = function(fragmentName, dataList, cb) {
        api.readFile({
            path: "widget://html/fragment/" + fragmentName
        }, function(ret, err) {
            if (ret.status) {
                var html = "";
                if (dataList.constructor === Array) {
                    dataList.forEach(function(item) {
                        var tempData = ret.data;
                        //替换模板数据
                        if (typeof item === "string") {
                            tempData = tempData.replace("{{item}}", item);
                        } else {
                            for (var pro in item) {
                                var reVal = item[pro];
                                var needVal = "{{" + pro + "}}";
                                tempData = tempData.replace(new RegExp(needVal, 'g'), reVal);
                            }
                        }
                        //判断有哪些值是没有被替换的
                        var reg = /{{\w*}}/g;
                        var errVal = tempData.match(reg);
                        if (errVal) {
                            errVal.forEach(function(item) {
                                //如果含有未被替换的值,则生成错误提示
                                console.error(item + "没有值");
                            });
                        }

                        html += tempData;

                    });
                    cb(html);
                } else {
                    console.error('不是数组');
                }

            } else {
                api.alert({
                    msg: '错误码: ' + err.code + '错误信息' + err.msg
                });
            }
        });
    };

    //获取服务器地址
    u.getServerUrl = function(cb) {
        api.getPrefs({
            key: 'serverUrl'
        }, function(ret, err) {
            var v = ret.value;
            if (v === '') {
                console.err("找不到服务器地址");
            } else {
                cb(ret.value);
            }
        });
    };

    //获取用户信息

    /*
    __v,_id,account,compounds,mobile,nickName,ownerMobile,ownerName,roomNumber,source,status:验证通过,unitName,updateDate,vCodePhone,zycode,
    */
    u.getUserInf = function(cb) {
        api.getPrefs({
            key: 'userInf'
        }, function(ret, err) {
            var v = ret.value;
            if (v === '') {
                // 不存在该变量
                cb(null);
            } else {
                cb(JSON.parse(v));
            }
        });
    };

    u.setUserInf = function(obj){
        api.setPrefs({
            key: 'userInf',
            value: obj
        });
    }


    //获取业主信息
    u.getOwnerUserInf = function(cb) {
        api.getPrefs({
            key: 'ownphone'
        }, function(ret, err) {
            var v = ret.val;
            if (v === '') {
                cb(null);
            } else {
                cb(v);
            }
        });
    };

    //弹出信息
    u.toastMsg = function(msg) {
        api.toast({
            msg: msg,
            duration: 2000,
            location: 'bottom'
        });
    };

    //打开窗体
    u.mOpenWin = function(winName, winUrl, param) {
        if (param) {
            if (typeof param == 'string') {
                param = JSON.parse(param);
            }
        }
        api.openWin({
            name: winName,
            url: winUrl,
            bounces: false,
            pageParam: param
        });
    };



    //根据登陆情况打开窗体
    u.verifyOpenWin = function(winName, winUrl, param) {
        u.getUserInf(function(user) {
            if (user) {
                u.mOpenWin(winName, winUrl, param);
            } else {
                u.mOpenWin("login", "login.html");
            }
        });
    };

    //认证手机号码
    u.verifyPhone = function(phoneNum, cb) {
        var reg = /^(13[0-9]|14[0-9]|15[0-9]|18[0-9])\d{8}/;
        if (phoneNum) {
            if (reg.test(phoneNum)) {
                cb(phoneNum);
            } else {
                $api.toastMsg("请输入正确的手机号码！");
            }
        } else {
            $api.toastMsg("手机号码不得为空");
        }
    };

    //发送手机短信
    u.sendMobileMsg = function(phoneNum, cb) {
        $api.verifyPhone(phoneNum, function(phone) {
            $api.do_post("/api/verify/send/msg?phone=" + phone, {}, function(result) {
                if (result.code === 0) {
                    cb();
                    $api.toastMsg(result.msg);
                } else {
                    console.error("code:" + result.code + "  msg:" + result.msg);
                    $api.toastMsg("短信发送失败");
                }
            });
        });
    };

    u.btnWait = function(btn) {
        var btnText = $(btn).text();
        var i = 30;
        $(btn).attr("disabled", true);
        var intervale = setInterval(function() {
            if (i > 0) {
                $(btn).text(btnText + "(" + i + ")");
            } else {
                $(btn).attr("disabled", false);
                $(btn).text(btnText);
                clearInterval(intervale);
            }
            i--;
        }, 1000);
    };

    u.log = function(err) {
        if(typeof err === 'string'){
            console.error(err);
            return;
        }
        for (var i in err) {          
            console.error(i + " : " + err[i] + "  ");
        }
    };

    u.getNetPicPath = function(picId, cb) {
        if (picId) {
            u.getServerUrl(function(serverUrl) {
                cb(serverUrl + "/files/" + picId);
            });
        } else {
            console.error("请传入图片ID");
            cb('');
        }
    };

    /*end*/


    window.$api = u;

})(window);